/* gm_robot.h -- Representação de um robô
 *
 * Copyright (C) 2008, Diogo F. S. Ramos <diogo.ramos@usp.br>
 * GEAR - Grupo de Estudos Avançados em Robótica
 * <http://www.sel.eesc.usp.br/gear>
 * 
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 */

#ifndef GM_ROBOT_H_
#define GM_ROBOT_H_

#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>

#ifdef __cplusplus
extern "C" {
#endif
    
#include "gm_protocol.h"

/** Posições do vetor field.  */
enum field_pos
{
    BALL_PX,			/**< Posição X da bola */
    BALL_PY,			/**< Posição Y da bola  */
    ROBOT_PX,			/**< Posição X do robô */
    ROBOT_PY,			/**< Posição X do robô */
    ROBOT_PA,			/**< Orientação do robô */
    G_ROBOT_0_PX,		/**< Posição X do robô GEAR 0 */
    G_ROBOT_0_PY,		/**< Posição Y do robô GEAR 0 */
    G_ROBOT_0_PA,		/**< Orientação do robô GEAR 0 */
    G_ROBOT_1_PX,		/**< Posição X do robô GEAR 1 */
    G_ROBOT_1_PY,		/**< Posição Y do robô GEAR 1 */
    G_ROBOT_1_PA,		/**< Orientação do robô GEAR 1 */
    G_ROBOT_2_PX,		/**< Posição X do robô GEAR 2 */
    G_ROBOT_2_PY,		/**< Posição Y do robô GEAR 2 */
    G_ROBOT_2_PA,		/**< Orientação do robô GEAR 2 */
    G_ROBOT_3_PX,		/**< Posição X do robô GEAR 3 */
    G_ROBOT_3_PY,		/**< Posição Y do robô GEAR 3 */
    G_ROBOT_3_PA,		/**< Orientação do robô GEAR 3*/

    A_ROBOT_0_PX,		/**< Posição X do robô adversário 0 */
    A_ROBOT_0_PY,		/**< Posição Y do robô adversário 0 */
    A_ROBOT_0_PA,		/**< Orientação do robô adversário 0 */
    A_ROBOT_1_PX,		/**< Posição X do robô adversário 1 */
    A_ROBOT_1_PY,		/**< Posição Y do robô adversário 1 */
    A_ROBOT_1_PA,		/**< Orientação do robô adversário 1 */
    A_ROBOT_2_PX,		/**< Posição X do robô adversário 2 */
    A_ROBOT_2_PY,		/**< Posição Y do robô adversário 2 */
    A_ROBOT_2_PA,		/**< Orientação do robô adversário 2 */
    A_ROBOT_3_PX,		/**< Posição X do robô adversário 3 */
    A_ROBOT_3_PY,		/**< Posição Y do robô adversário 3 */
    A_ROBOT_3_PA,		/**< Orientação do robô adversário 3 */
    A_ROBOT_4_PX,		/**< Posição X do robô adversário 4 */
    A_ROBOT_4_PY,		/**< Posição Y do robô adversário 4 */
    A_ROBOT_4_PA,		/**< Orientação do robô adversário 0 */
};

typedef struct gm_robot_t gm_robot_t;

/** Objeto que representa um robô. */
struct gm_robot_t
{
    /** Identificador do robô. Utilizado para identifica-lo quando o
     * mesmo requisitar informações do servidor. */
    int id;

    /** Endereço de 3 bytes do robô */
    char end[3];

    /** Socket para o servidor */
    int sock;

    /** Informações sobre o socket */
    struct sockaddr_in servername;

    /** Mensagem */
    char msg[MAX_LENGTH_MSG];

    /** Velocidade vx */
    float vx;
    /** Velocidade vy */
    float vy;
    /** Velocidade de rotação va */
    float va;

    /** Estado do sistema de drible  */
    int dribble_enable;

    /** Nível do último chute */
    int kick_lvl;
    
    /** Vetor que possui as informações de jogo organizadas.
     *
     * Para acessar estas informações deve-se utilizar o enum
     * ::field_pos. Por exemplo:
     *
     * Para achar a posição X da bola: field[BALL_PX].
     *
     * Para achar a direção do robô: field[ROBOT_PA].
     *
     * Para achar a posição Y do robô adversário 2: field[A_ROBOT_2_PY].
     *
     */
    float *field;
    int field_size;
    /** Vetor com as informações cru retiradas do servidor. */
    float *info;
    int info_size;
    /** Informações do mundo. Utilizar o enum ::world_pos do arquivo
     * gm_server.h para localizar os dados no vetor.*/
    float *world;
    int world_size;

};

gm_robot_t * gm_robot_new( const int id, const char end[3], const char * addr, const int port );
void gm_robot_destroy( gm_robot_t * self );
void gm_robot_say_hello( gm_robot_t * self );
void gm_robot_read( gm_robot_t * self );
void gm_robot_read_world( gm_robot_t *self);
void gm_robot_set_vel( gm_robot_t * self, const float vx, const float vy, const float va );
void gm_robot_dribble_enable( gm_robot_t * self, const int enable );
void gm_robot_kick( gm_robot_t *self, const int nivel);

#ifdef __cplusplus
}
#endif

#endif	/* GM_ROBOT_H_ */
